#pragma once

#include <string>
#include <cstring>
#include <iostream>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include<netinet/in.h>
#include<netinet/in.h>
#include <arpa/inet.h>

namespace Client
{
    using namespace std;
    class udpClient
    {
    public:
        udpClient(string severip, uint16_t serverport) : _socketfd(-1), _serverip(severip), _serverport(serverport)
        {
        }

        void initClient() // 创建套接字
        {
            _socketfd = socket(AF_INET, SOCK_DGRAM, 0);
            if (_socketfd == -1)
            {
                cerr << "socket error: " << errno << " : " << strerror(errno) << endl;
                exit(2);
            }
            cout << "socket success: "
                 << " : " << _socketfd << endl;
        }
        void run()
        {
            struct sockaddr_in server;      //用于保存服务端的信息
            bzero(&server,sizeof(server));

            server.sin_family = AF_INET;
            server.sin_addr.s_addr = inet_addr(_serverip.c_str());
            server.sin_port = htons(_serverport);

            //bind,客户端的编写是有很多人写，所以所有软件对应的公司在同一台客户端形成统一的端口号申请和回收管理是非常难的 
            //  -》  客户端的端口号是OS自动的绑定的，不用写（并不是不绑定）
            string buffer;
            while(!_quit)
            {
                cout << "Please Enter# ";
                cin >> buffer;
                sendto(_socketfd,buffer.c_str(),buffer.size(),0,(struct sockaddr*)&server,sizeof(server));
            }
        }

    private:
        int _socketfd;        // 套接字对于的文件描述符  初始化时不用填，在链接启动时填写
        string _serverip;     // 服务器的ip
        uint16_t _serverport; // 服务器端口号
        bool _quit;           // 检查是否退出

    };
}
